半个月前开始搞USB HOST读U盘的固件,一开始也是什么都不懂,
只是以前搞过cypress的USB芯片CY7C68013A,对USB协议有一点基础。
为了搞好USB,首先阅读了圈圈的《圈圈教你玩USB》 这本书,书写的很详细,跟着他的思路走,
能把USB协议的各个部分都接触到,即使硬件条件不同,但他的固件是自己一步一步写出来的,对USB的通信过程理解有很大帮助。然后就是熟悉stm32的USB 固件库,首先用DEVICE库的例子,自己修改,
由于当时只有stm32f103的硬件条件,做了一个使用内部FLASH空间的256K小U盘,这样对USB device的固件结构有了大概了解。之后,了解FATFS的内容,将FATFS移植到stm32f103上,目的就是管理着256KB的FLASH空间,这样结合USB device的固件,就可以通过电脑修改文件,
然后通过串口发送命令,使用FATFS读或者写文件,观察效果。这样就熟悉了FATFS文件系统的使用和移植注意事项。再下来就是官方的OTG_FS库了,这个库适用于包含OTG模块的f105,107和f2xx系列,这个库有一个说明文档pdf,读了一遍,只是知道一些概念,
具体的东西还是不知所谓。然后就打开固件库中的USB HOST读U盘的例子,从main函数和终端处理开始逐步分析USB HOST的数据通信过程,慢慢对照着USB协议,大概有了了解。之后就是实际地把固件库的例子移植到stm32f207,我们的板子上现在是stm32f103,淘宝买了3块stm32f207的芯片
(想买5片的,领导只让买3片,话说公司连专门的电子实验室都没有,只有一个烙铁,一个风枪,我真担心自己焊工。不过还好,很顺利的就焊好了,看来前两年做硬件的确不是白做的啊)
207是不能直接替换掉103的,有几个管脚不一样,我用了几根飞线做的。固件中,去掉官方那些为了适应不同开发板的繁琐定义,由于我没有负责板子的LCD驱动部分,所以没办法控制LCD。也就将例子中的LCD显示改成串口printf。
然后由于我用的是8M晶振,官方是24M,我就直接改了stm32f2xx.h中的宏定义,HSE_VALUE 8000000.
移植好了之后,发现插上U盘,枚举不成功,无法获取设备描述符。跟踪调试,最终还是觉得是底层硬件驱动的问题。
最有可能的,要么就是USB的配置,要么就是时钟。
后来想到刚开始接触stm32f2xx系列的时候,看过一个文档,是说stm32f1xx固件移植到stm32f2xx的,里面说stm32f2xx的时钟设置,有专门的工具。
从官网下载这个工具,配置时钟,用新生成的system_stm32f2xx.c文件代替原来的文件后,居然可以枚举成功了。。
可是能枚举,却不能读写文件啊,发送命令readcommand10之后移植返回 Unrecovered error state,
想要跟踪调试,但是固件库是官方提供的标准的东西啊,不可能需要我改啊,枚举成功了,说明底层通信没问题啊,莫非是数据传输端点设置问题,完全是跟官方的例子一样的,不会有错。
在网上查找资料,有人说1G的U盘可以,我找了一个1G的U盘,插上去,居然可以读了啊。
肯定是兼容性问题了,这个问题明天再来解决。
然后就是fatfs显示内容,有一些文件名不正常,小写字母变成了大写,网上说是因为没有支持长文件名。
之前已经做好了FATFS的长文件名支持版本,这次再修改下应该很容易。
串口输出数据如下:
Device Attached
Full speed device detected
VID : 058Fh
PID : 6387h
Mass storage device connected
Manufacturer : Generic
Product : Mass Storage
Serial Number : 99027840
Enumeration completed
Exploring disk flash …
|STM32.TXT
|CREM
| |CREMFR~1.XLS
| |信息记录.TXT
|__CREM中国
Write file….
‘CREM.TXT’ file created